// pages/cart/index.js
//导入封装好的wxApi
// import {getSetting,openSetting,chooseAddress} from "../../utils/wxApi";
import wxApi from "../../utils/wxApi";

Page({

  /**
   * 页面的初始数据
   */
  data: {
    //存放用户地址信息
    address:{},
    //购物车数据
    cart:[],
    //是否全选
    allChecked: false,
    //总价格
    totalPrice: 0,
    //总数量
    totalNum: 0
  },

  //获取收获地址
  //在onShow生命周期中初始化页面数据(收获地址, 购物车列表, 是否全选 合计)
  onShow:function(){
    let address = wx.getStorageSync('address') || {};
    this.setData({address});
    let cart = wx.getStorageSync('cart') || [];
    this.updateCart(cart)

    /**
     * 实现全选的逻辑
     * 0. 定义一个全局变量 来表示购物车中的数据是否被全选
     *  1.根据购物车中的商品数据信息 如果商品的checked都为true就是全选 否则不用处理
     */
    //数组的every方法 遍历所有数据, 方法接受一个回调函数为参数, 这个回调函数的返回值必须为布尔类型,当所有回调函数的返回值都为true的时候 every方法 返回true; 
    // every方法的性能问题: 如果循环中出现一个不符合条件的值,那么将停止循环,然后直接返回false
    // let allChecked = true;
    // let allChecked = cart.every(item=>item.checked);
    /**
     * 实现总价格和总数量合计逻辑
     * 1. 遍历购物车数组
     * 2. 判断商品是否被选中 如果被选中才参与计算
     * 3. 总价格 += 商品的单价 * 数量
     * 4. 总数量 += 商品的数量 
     */
    //总价格,总数量
    // let totalPrice = 0;
    // let totalNum = 0;
    // cart.forEach(item=>{
    //   if(item.checked){
    //     totalPrice += item.goods_price * item.num;
    //     totalNum += item.num;
    //   }else{
    //     allChecked = false;
    //   }
    // });
    // allChecked = cart.length?allChecked:false
    // this.setData({
    //   address,cart,allChecked,totalPrice,totalNum
    // })
  },

  //更新购物车状态
  updateCart(cart){
    let allChecked = true;
    let totalPrice = 0;
    let totalNum = 0;
    cart.forEach(item=>{
      if(item.checked){
        totalPrice += item.goods_price * item.num;
        totalNum += item.num;
      }else{
        allChecked = false;
      }
    });
    allChecked = cart.length?allChecked:false
    this.setData({
      cart,allChecked,totalPrice,totalNum
    });
    //更新到缓存中
    wx.setStorageSync('cart', cart)
  },

  //某条商品数据被选中事件处理
  onItemCheckChange(e){
    /**
     * 1.获取被选中的商品id
     * 2.获取商品当前的选中状态 然后取反
     * 3 需要重新计算的内容 --> 全选按钮  总价格 总数量
     */
    //1.获取被选中的商品id
    let goodsId = e.currentTarget.dataset.id;
    //2.获取购物车信息,根据商品id找到当前商品的信息
    let {cart} = this.data;
    let index = cart.findIndex(item=>item.goods_id === goodsId);
    let curGoods = cart[index];
    curGoods.checked = !curGoods.checked;
    //重新计算是否全选 和价格合计 以及数量合计
    this.updateCart(cart)
  },

  //全选按钮回调函数
  onAllCheckClick(e){
    /**
     * 1.获取当前按钮的状态 allChecked
     * 2.allChecked状态取非  全选=true  全不选=false
     * 3.获取购物车数据, 把allChecked赋值给所有数据的checked
     * 4.更新数据
     */
    let {allChecked,cart} = this.data;
    allChecked = !allChecked;
    cart.forEach(item=>item.checked = allChecked)
    this.updateCart(cart);
  },

  //商品加减事件
  handleItemNumEdit(e){
    console.log("全选按钮回调函数",e);
    /**
     * 1.要加减的num -1 || +1
     * 2.想办法获取当前商品的id
     * 3.通过当前商品id获取商品信息
     * 4.在当前商品信息中直接操作num属性
     * 5.调用自定义的更新函数, 更新到页面中
     */
    let {id, num} = e.currentTarget.dataset;
    let {cart} = this.data;
    let index = cart.findIndex(item=>item.goods_id===id);
    let goodsInfo = cart[index];
    /**
     * 1. 当商品数量为1的时候 用户点击了减号
     * 2. 删除当前商品
     */
    if(goodsInfo.num === 1 && num === -1){
      wx.showModal({
        title: '提示',
        content: '是否移除此商品?',
        success: (res)=> {
          if (res.confirm) {
            cart.splice(index, 1);
            this.updateCart(cart);
          } else if (res.cancel) {
            console.log('用户点击取消')
          }
        }
      })
    }else{
      goodsInfo.num += num;
      this.updateCart(cart);
    }
  },

  //点击结算按钮
  onPayClick: async function(e){
    /**
     * 1.判断是否拥有收获地址
     * 2.购物车有没有数据
     * 3.有没有商品被选中
     * 4.跳转pay页面
     */
    let {address,totalNum} = this.data;
    if(!address.userName)  return await wxApi.showToast('请选择收货地址');
    if(!totalNum) return await wxApi.showToast('还没有选择商品');
    wx.navigateTo({
      url: '/pages/pay/index',
    })
  },

  //获取收货地址
  getAddress: async function () {
    //微信内置 API   获取用户当前的收获地址
    //  在之前 获取用户信息 需要用户授权 
    /**
     * 需要用户授权 
     *  1 确定 ==>
     *  2 取消 ==> 再点击按钮 就不会有任何反应了
     *      1.通过wx.getSetting 查看用户是否给某一个功能设置过权限
     *            1.如果有这个权限,则 正常调用获取的API
     *            2.如果用户没有给这个功能权限
     *                1.引导用户打开授权设置 wx.openSetting
     *                2.等用户设置完成之后 再次尝试调用获取API
     * 
     * 按照当前的案例(scope.address) 当前小程序获取地址的权限
     *    1.通过wx.getSetting 查看用户是否给获取地址信息的权限
     *        getSetting的success回调函数中 通过res.authSetting["scope.address"]
     *      //let addressSuccess = res.authSetting["scope.address"]
     *      1.addressSuccess=true  如果有这个权限,则 正常调用获取的API==> wx.chooseAddress
     *      2.addressSuccess=false||undefined 如果用户没有给这个功能权限
     *           1.引导用户打开授权设置 wx.openSetting
     *           2.等用户设置完成之后 在openSetting的success回调函数中 再次尝试调用获取API ==>wx.chooseAddress
     *        
     */
    //A => =>c/d
    //获取用户授权信息 API
    // wx.getSetting({//获取用户授权信息 API
    //   withSubscriptions: true,
    //   success:(res)=>{
    //     // console.log("用户授权",res)
    //     let addressSuccess = res.authSetting["scope.address"]
    //     if(addressSuccess){
    //       wx.chooseAddress({
    //         success: (result) => {
    //           console.log("地址",result)
    //         },
    //       })
    //     }else{
    //       //打开用户授权
    //         wx.openSetting({//打开用户授权
    //           withSubscriptions: true,
    //           success:(res)=>{//1.引导用户打开授权设置 wx.openSetting
    //             console.log("用户授权",res);
    //             wx.chooseAddress({
    //               success: (result) => {
    //                 console.log("地址",result)
    //               },
    //             })
    //           }
    //         })
    //     }
    //   }
    // })

    // getSetting,openSetting,chooseAddress

    console.log("settings", wxApi)
    try {
      let settings = await wxApi.getSetting();
      let addressSuccess = settings.authSetting["scope.address"]
      if (!addressSuccess) await wxApi.openSetting();
      let address = await wxApi.chooseAddress();
      console.log("地址", address);
      address.all = address.provinceName + address.cityName +  address.countyName + address.detailInfo;
      wx.setStorageSync('address', address);
      this.setData({
        address
      })
      
    } catch (err) {
      console.log(err)
    }
  }
  //用户授权登录
  //支付相关
  //设备(扫一扫 蓝牙 话筒 音频 用户手机通讯录 用户地址信息)
})